//package cn.liukuan.jps.redis;
//
//import org.apache.lucene.store.RedisRAMDirectory;
//import org.apache.lucene.util.Accountable;
//
//import java.io.Serializable;
//import java.util.ArrayList;
//import java.util.Arrays;
//
///**
// * Created by liukuan on 16/5/30.
// */
//public class RedisRAMFile implements Accountable, Serializable {
//    protected final ArrayList<byte[]> buffers = new ArrayList<byte[]>();
//    long length;
//    public RedisRAMDirectory directory;
//    protected long sizeInBytes;
//
//    // File used as buffer, in no RAMDirectory
//    public RedisRAMFile() {}
//
//    RedisRAMFile(RedisRAMDirectory directory) {
//        this.directory = directory;
//    }
//    public synchronized long getLength() {
//        return length;
//    }
//
//    protected synchronized void setLength(long length) {
//        this.length = length;
//    }
//
//    protected final byte[] addBuffer(int size) {
//        byte[] buffer = newBuffer(size);
//        synchronized(this) {
//            buffers.add(buffer);
//            sizeInBytes += size;
//        }
//
//        if (directory != null) {
//            directory.sizeInBytes.getAndAdd(size);
//        }
//        return buffer;
//    }
//
//    protected final synchronized byte[] getBuffer(int index) {
//        return buffers.get(index);
//    }
//
//    protected final synchronized int numBuffers() {
//        return buffers.size();
//    }
//
//    /**
//     * Expert: allocate a new buffer.
//     * Subclasses can allocate differently.
//     * @param size size of allocated buffer.
//     * @return allocated buffer.
//     */
//    protected byte[] newBuffer(int size) {
//        return new byte[size];
//    }
//
//    public synchronized long ramBytesUsed() {
//        return sizeInBytes;
//    }
//
//    @Override
//    public String toString() {
//        return getClass().getSimpleName() + "(length=" + length + ")";
//    }
//
//    @Override
//    public int hashCode() {
//        int h = (int) (length ^ (length >>> 32));
//        for (byte[] block : buffers) {
//            h = 31 * h + Arrays.hashCode(block);
//        }
//        return h;
//    }
//
//    @Override
//    public boolean equals(Object obj) {
//        if (this == obj) return true;
//        if (obj == null) return false;
//        if (getClass() != obj.getClass()) return false;
//        RedisRAMFile other = (RedisRAMFile) obj;
//        if (length != other.length) return false;
//        if (buffers.size() != other.buffers.size()) {
//            return false;
//        }
//        for (int i = 0; i < buffers.size(); i++) {
//            if (!Arrays.equals(buffers.get(i), other.buffers.get(i))) {
//                return false;
//            }
//        }
//        return true;
//    }
//}
//
